// 14. [2020 统考真题]定义三元组(a,b,c) (a、 b、c均为正数)的距离D=|a-b|+|b-c|+
// |c- a|。 给定3个非空整数集合S、S2和S3，按升序分别存储在3个数组中。请设计一
// 个尽可能高效的算法，计算并输出所有可能的三元组(a, b, c) (a∈S，b∈S, c∈S3) 中
// 的最小距离。例如S;={-1,0,9}，Sz= {-25,-10, 10,11}，S3={2,9, 17, 30,41}，则最
// 小距离为2,相应的三元组为(9, 10, 9)。要求:
// 1)给出算法的基本设计思想。
// 2)根据设计思想，采用C语言或C++语言描述算法，关键之处给出注释。
// 3)说明你所设计算法的时间复杂度和空间复杂度。

#pragma once
#include "vector"
#include "iostream"
template <typename ElemType>
void printVec(std::vector<ElemType> &vec)
{
    for (auto &i : vec)
    {
        std::cout << i << ",";
    }
    std::cout << "\r\n";
}
int getDisOfABC(int A, int B, int C)
{
    return abs(A - B) + abs(B - C) + abs(A - C);
}
bool checkAMin(int A, int B, int C)
{
    if (A <= B && A <= C)
    {
        return true;
    }
    return false;
}
template <typename ElemType>
bool findMinDistance(
    ElemType &retrun_find,
    std::vector<ElemType> &vec1, std::vector<ElemType> &vec2, std::vector<ElemType> &vec3)
{
    int i = 0, j = 0, k = 0;
    int minDisc = 0x7fffffff;
    while (i < vec1.size() && j < vec2.size() && k < vec3.size())
    {
        auto disc = getDisOfABC(vec1[i], vec2[j], vec3[k]);
        //当三个数列都未到底
        if (disc < minDisc)
        {
            minDisc = disc;
        }
        if (checkAMin(vec1[i], vec2[j], vec3[k]))
        {
            i++;
        }
        else if (checkAMin(vec2[j], vec1[i], vec3[j]))
        {
            j++;
        }
        else
        {
            k++;
        }
    }
    retrun_find = minDisc;
    return true;
    // return false;
}
int main()
{
    std::cout << "hello \r\n";
    int arrA[] = {-1, 0, 9};
    int arrB[] = {-25, -10, 10, 11};
    int arrC[] = {2, 9, 17, 30, 41};
    // std::vector<int> A =
    //     std::vector<int> B =
    std::vector<int> A(arrA, arrA + sizeof(arrA) / sizeof(int));
    std::vector<int> B(arrB, arrB + sizeof(arrB) / sizeof(int));
    std::vector<int> C(arrC, arrC + sizeof(arrC) / sizeof(int));

    printVec(A);
    printVec(B);
    printVec(C);
    int find;
    if (findMinDistance(find, A, B, C))
    {
        std::cout << "min is \r\n";
        std::cout << find //;
                  << "\r\n";
    }
    else
    {
        std::cout << "not find \r\n";
        // std::cout << findMiddleOfAB(B, A) //;
        //   << "\r\n";
    }

    // std::vector<int> vec1; // vec2, vec3;
    // int arr[100];
    // std::cout << "hello"
    //           << "\r\n";
    // //init data
    // for (int i = 0; i < 100; i++)
    // {
    //     arr[i] = i;
    // }
    // leftMoveArr(arr, 100, 30);

    // // fastFind(vec1, 9);
    // for (int i = 0; i < 100; i++)
    // {
    //     std::cout << arr[i] << ",";
    // }
    // std::cout << "\r\n";
    // for (int i = 0; i < vec2.size(); i++)
    // {
    //     std::cout << vec2[i] << ",";
    // }
    // std::cout << "\r\n";
    // ///////////////////////////////////////////////////
    // combineAB2C(vec1, vec2, vec3);
    // for (int i = 0; i < vec3.size(); i++)
    // {
    //     std::cout << vec3[i] << ",";
    // }
    // std::cout << "\r\n";
    return 0;
}